package com.xuwei.base.oop;

/**
 * Project Name:javaBaseReview
 * Package Name:
 * author:David
 * Date:2015年6月16日下午4:27:50
 * Copyright (c) 2015, xw123box@126.com All Rights Reserved.
 *
 */

/**
 * java中类继承深入研究
 * 
 * @author David
 * @since 2015年6月16日 下午4:27:51
 * @version
 * @since JDK 1.6
 */
public class Son extends Parent {
	public Son() {
		System.out.println("public son function invoked.");
	}

	/*
	 * void B(){ 父类中被final修饰的方法不能够被重写
	 * 
	 * }
	 */

	void B(int i) { // 这个本质上是重新定义一个新的方法，而不是重载父类中被final修饰的方法
		System.out.println("son void B(int i) invoked.");
	}

	{
		System.out.println("son's block loaded.");
	}

	public static void main(String[] args) {
//		Parent test = new Son();
//		System.out.println("---");
//		test = new Son();

		Son test1 = new Son();
		test1.B(2);
		System.out.println("---");
//		test1 = new Son();
		test1.B();

		/**
		 * java中静态方法、静态区中的内容是在类加载前执行的。
		 * 父类创建子类时，需要加载父类字节码，所以在加载父类字节码之前执行了父类中静态区的代码，
		 * 然后调用父类的构造方法初始化子类。
		 * 再用前面父类定义的引用创建子类实例时为什么不调用父类静态区代码？原因很简单，因为父类字节码
		 * 这时还在内存中，不需要加载，静态方法是加载字节码之前执行的，这时没机会执行了。
		 * 
		 * 直接使用子类创建实例时，首次加载父类的字节码，执行父类的静态区代码；子类调用了
		 * 父类的构造方法，因为子类把父类的构造方法继承过来了，相当于子类拥有一个父类的构造方法，
		 * 自然会调用了。
		 * 
		 */
	}

}

class Parent {
	static {
		System.out.println("parent static block loaded.");
	}

	protected Parent() {
		System.out.println("protected Parent function invoked.");
	}

	final void B() {
		System.out.println("final B function invoked. ");
	}
}
